function foo() {
    var a = 1
    let b = 2
    {
        let b = 3
        var c = 4
        let d = 5
        console.log(a);
        console.log(b);
    }
    console.log(b);
    console.log(c);
    console.log(d);
}

foo()

// 编译大概流程(函数体内): a = undefind放入变量环境
// b = undefind放入词法环境中的栈底部，后括号内的块布局
// 在词法环境中开辟一个小区域(也就是在即在括号内且在函数体内的b=undefind的上面)
// 现在先不用对括号里面的let和const进行编译，这个要在执行到这个括号时，再编译执行
// 这个括号的编译执行流程就相当于函数在全局的编译执行流程